package com.eelye.util;

import java.util.Arrays;

public class MathUtil {

    /**
     * 四舍五入除法。此算法不是最优算法。
     *
     * @param a
     * @param b
     * @return
     */
    static public int roundDiv(int a, int b) {
        return a / b + (a % b) >>> 2 / b;
    }

    /**
     * 四舍五入除法。此算法不是最优算法，如果要追求极致性能，请参考其他算法。
     *
     * @param a
     * @param b
     * @return
     */
    static public long roundDiv(long a, long b) {
        return (a + (b >>> 1)) / b;
    }

    static public long ceilDiv(long a, long b) {
        long r = a / b;
        // 两个数符号相同，且没有余数，加1。因为符号不同r是加1了的。
        if ((a ^ b) > 0 && (r * b != a)) {
            ++r;
        }
        return r;
    }

    static public double log(double val, double base) {
        return Math.log(val) / Math.log(base);
    }

    public static long floorDiv(long l, long l1) {
        long result = l / l1;
        if ((l % l1 != 0) && ((l ^ l1) < 0)) {
            result--;
        }
        return result;
    }

    public static int floorDiv(int l, int l1) {
        int result = l / l1;
        if ((l % l1 != 0) && ((l ^ l1) < 0)) {
            result--;
        }
        return result;
    }

    public static long min(long... values) {
        return Arrays.stream(values).min().getAsLong();
    }

    public static long max(long... values) {
        return Arrays.stream(values).max().getAsLong();
    }
}
